`use strict`

let {Sequelize,DataTypes}=require('sequelize');


let {database,username,password,host,dialect}=require('./config')

//初始化sequelize实例，注意Sequelize跟selequize的大小写区别

let sequelize=new Sequelize(database,username,password,{
    host:host,
    dialect:dialect
});


//定义一个方法，用来统一模型
function defineModel(name,attrs){
    let prop={};

    prop.id={
        type:DataTypes.INTEGER,
        primaryKey:true,
        autoIncrement:true
    };

    prop.createAt={
        type:DataTypes.BIGINT,
        alllowNull:false
    };
    prop.updataAt={
        type:DataTypes.BIGINT,
        alllowNull:false
    };
    prop.version={
        type:DataTypes.BIGINT,
        alllowNull:false
    };
    prop.remarks={
        type:DataTypes.STRING(800),
        alllowNull:false
    };
    
    for(var item in attrs){ 
        let value=attrs[item];
        prop[item]=value;
    };

    let User=sequelize.define(name,prop,{
        tableName:name,
        timestamps:false,
        // 定义勾子
        hooks:{
            // 在数据插入时，在对将要插入的数据进行验证之前（能否为空、默认值、是否唯一等约束进行验证的时候）
            beforeValidate:function(obj){
                // 生成一个时间戳
                let nw=Date.now();
                // 如果是新插入数据，则创建时间和更新时间一样，并且版本设置为0；如果是更新数据，则更新时间重新赋值，并对版本自增1
                if(obj.isNewRecord){
                    obj.createdAt=nw;
                    obj.updatedAt=nw;
                    obj.version=0;
                }else{
                    obj.updatedAt=nw;
                    obj.version+=1;
                }
            }
        }

    });
    return User;
};
// 准备将Sequelize的一个实例、模型定义方法、数据类型
let obj={
    sequelize,
    defineModel,
    DataTypes
};


// 暴露这个对象
module.exports=obj;